@@ -167,6 +167,12 @@ EVENT_EXPIRATION_CHECK=6h |
||
167 | 167 |
# enabled. |
168 | 168 |
#USE_GRAPHVIZ_DOT=dot |
169 | 169 |
|
170 |
+# Default layout for agent flow diagrams generated by Graphviz. |
|
171 |
+# Choose from `circo`, `dot` (default), `fdp`, `neato`, `osage`, |
|
172 |
+# `patchwork`, `sfdp`, or `twopi`. Note that not all layouts are |
|
173 |
+# supported by Graphviz depending on the build options. |
|
174 |
+#DIAGRAM_DEFAULT_LAYOUT=dot |
|
175 |
+ |
|
170 | 176 |
# Timezone. Use `rake time:zones:local` or `rake time:zones:all` to get your zone name |
171 | 177 |
TIMEZONE="Pacific Time (US & Canada)" |
172 | 178 |
|
@@ -3,6 +3,7 @@ |
||
3 | 3 |
$ -> |
4 | 4 |
svg = document.querySelector('.agent-diagram svg.diagram') |
5 | 5 |
overlay = document.querySelector('.agent-diagram .overlay') |
6 |
+ $(overlay).width($(svg).width()).height($(svg).height()) |
|
6 | 7 |
getTopLeft = (node) -> |
7 | 8 |
bbox = node.getBBox() |
8 | 9 |
point = svg.createSVGPoint() |
@@ -1,8 +1,8 @@ |
||
1 | 1 |
module DotHelper |
2 |
- def render_agents_diagram(agents) |
|
2 |
+ def render_agents_diagram(agents, layout: nil) |
|
3 | 3 |
if (command = ENV['USE_GRAPHVIZ_DOT']) && |
4 | 4 |
(svg = IO.popen([command, *%w[-Tsvg -q1 -o/dev/stdout /dev/stdin]], 'w+') { |dot| |
5 |
- dot.print agents_dot(agents, true) |
|
5 |
+ dot.print agents_dot(agents, rich: true, layout: layout) |
|
6 | 6 |
dot.close_write |
7 | 7 |
dot.read |
8 | 8 |
} rescue false) |
@@ -125,7 +125,7 @@ module DotHelper |
||
125 | 125 |
DotDrawer.draw(vars, &block) |
126 | 126 |
end |
127 | 127 |
|
128 |
- def agents_dot(agents, rich = false) |
|
128 |
+ def agents_dot(agents, rich: false, layout: nil) |
|
129 | 129 |
draw(agents: agents, |
130 | 130 |
agent_id: ->agent { 'a%d' % agent.id }, |
131 | 131 |
agent_label: ->agent { |
@@ -158,7 +158,10 @@ module DotHelper |
||
158 | 158 |
end |
159 | 159 |
|
160 | 160 |
block('digraph', 'Agent Event Flow') { |
161 |
- # statement 'graph', rankdir: 'LR' |
|
161 |
+ layout ||= ENV['DIAGRAM_DEFAULT_LAYOUT'].presence |
|
162 |
+ if rich && /\A[a-z]+\z/ === layout |
|
163 |
+ statement 'graph', layout: layout, overlap: 'false' |
|
164 |
+ end |
|
162 | 165 |
statement 'node', |
163 | 166 |
shape: 'box', |
164 | 167 |
style: 'rounded', |
@@ -197,7 +200,6 @@ module DotHelper |
||
197 | 200 |
root << svg |
198 | 201 |
root << overlay_container = Nokogiri::XML::Node.new('div', doc) { |div| |
199 | 202 |
div['class'] = 'overlay-container' |
200 |
- div['style'] = "width: #{svg['width']}; height: #{svg['height']}" |
|
201 | 203 |
} |
202 | 204 |
overlay_container << overlay = Nokogiri::XML::Node.new('div', doc) { |div| |
203 | 205 |
div['class'] = 'overlay' |
@@ -20,7 +20,7 @@ |
||
20 | 20 |
</div> |
21 | 21 |
|
22 | 22 |
<div class='digraph'> |
23 |
- <%= render_agents_diagram(@agents) %> |
|
23 |
+ <%= render_agents_diagram(@agents, layout: params[:layout]) %> |
|
24 | 24 |
</div> |
25 | 25 |
</div> |
26 | 26 |
</div> |
@@ -72,7 +72,7 @@ describe DotHelper do |
||
72 | 72 |
end |
73 | 73 |
|
74 | 74 |
it "generates a richer DOT script" do |
75 |
- expect(agents_dot(@agents, true)).to match(%r{ |
|
75 |
+ expect(agents_dot(@agents, rich: true)).to match(%r{ |
|
76 | 76 |
\A |
77 | 77 |
digraph \x20 "Agent \x20 Event \x20 Flow" \{ |
78 | 78 |
node \[ [^\]]+ \]; |